//package mathutils;
//
//public class Line{
//	public double a;
//	public double b;
//	public double c;
//	
//	public PointD p1;
//	public PointD p2;
//	
//	public Line(PointD p1, PointD p2) {
//		this.p1 = p1;
//		this.p2 = p2;
//		b = p2.x - p1.x;
//		a = p1.y - p2.y;
//		
//		c = p2.y * p1.x - p2.x * p1.y;
//	}
//	
//	public double getLength(){
//		return Math.hypot(a, b);
//	}
//	
//	public PointD createPerpendicularTo(Line lineTo, PointD p) throws IllegalArgumentException {
//		double del = a * lineTo.a + b * lineTo.b;
//		if (del == 0) {
//			throw new IllegalArgumentException("LineTo is already perpendicular");
//		}
//		double d = (b * p.x - a * p.y);
//		
//		double x = (-lineTo.c * a + lineTo.b * d) / del;
//		double y = (-lineTo.c * b - lineTo.a * d) / del;
//		
//		return new PointD(x, y);
//	}
//	
//	public double getDistanceTo(PointD p) {
//		return (a * p.x + b * p.y + c) / Math.sqrt(a*a + b*b);
//	}
//	
//	public boolean contains(PointD p){
//		return ((p.x >= p1.x && p.x <= p2.x) || (p.x <= p1.x && p.x >= p2.x))
//				&& ((p.y >= p1.y && p.y <= p2.y) || (p.y <= p1.y && p.y >= p2.y));
//	}
//	
//	public boolean oneDirection(Line line){
//		return (b * line.b + a * line.a) >= 0;
//	}
//	
//	@Override
//	public String toString() {
//		return "A = " + a + ", B = " + b + ", C = " + c;
//	}
// }